/**
 * @file tsk_analy_queue.c
 * @brief tskp库 - 解析队列模块实现文件
 * @details
 * 本文件实现了解析队列的初始化、判空、判满、入队、出队等基本操作。
 * 适用于嵌入式、实时系统下的任务参数解析缓存，采用静态循环队列结构，支持高效、无阻塞的数据缓存与处理。
 * 
 * 作者：小傲（个人开发）
 * 邮箱：2655640770@qq.com
 * 版权声明：开源公开，欢迎建议与反馈
 * 
 * 适用范围：
 *   - tskp任务调参库的参数解析缓存
 *   - 需要高效、轻量级队列的嵌入式项目
 * 
 * 日期：2025-09-11
 */

#include "tsk_analy_queue.h"

#ifdef _TSK_TSKP_

/**
 * @brief        // 初始化解析队列
 * @param[in]    // p : 指向tsk_analy_Queue结构体的指针
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_analy_Queue_Init(tsk_analy_Queue *p){
    p->front=0;
    p->rear=0;
    p->count=0;
}

/**
 * @brief        // 判断解析队列是否为空
 * @param[in]    // p : 解析队列结构体
 * @return       // bool : true为空，false为非空
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_is_analy_Queue_Empty(tsk_analy_Queue p){
    return p.count==0;
}

/**
 * @brief        // 判断解析队列是否为满
 * @param[in]    // p : 解析队列结构体
 * @return       // bool : true为满，false为未满
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_is_analy_Queue_Full(tsk_analy_Queue p){
    return p.count==TSK_ANALY_QUEUE_MAXLEN;
}

/**
 * @brief        // 向解析队列中推入一个数据
 * @param[in]    // p    : 指向tsk_analy_Queue结构体的指针
 * @param[in]    // data : 要推入的数据
 * @return       // tsk_analy_queue_enum_t : 推入结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_analy_queue_enum_t Tsk_analy_Queue_Push(tsk_analy_Queue* p,char data){
    if(tsk_is_analy_Queue_Full(*p)){
        return TSK_ANALY_QUEUE_FULL;
    }
    p->data[p->rear]=data;
    p->rear++;
    p->rear%=TSK_ANALY_QUEUE_MAXLEN;
    p->count++;
    return TSK_ANALY_QUEUE_OK;
}

/**
 * @brief        // 从解析队列中弹出一个数据
 * @param[in]    // p    : 指向tsk_analy_Queue结构体的指针
 * @param[out]   // temp : 弹出的数据指针
 * @return       // tsk_analy_queue_enum_t : 弹出结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_analy_queue_enum_t Tsk_analy_Queue_Pop(tsk_analy_Queue* p,char* temp){
    if(tsk_is_analy_Queue_Empty(*p)){
        return TSK_ANALY_QUEUE_EMPTY;
    }
    *temp=p->data[p->front];
    p->front++;
    p->front%=TSK_ANALY_QUEUE_MAXLEN;
    p->count--;
    return TSK_ANALY_QUEUE_OK;
}

#endif
